home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks96 / BootingGallery.sit / Booting Gallery / Booting Gallery (source) / Sources / Duck Game Sources / DuckGame.cpp next >
Text File  |  1996-06-22  |  4KB  |  218 lines

  1. /***
  2.  *     Created by Bill Hubauer on Fri, Jun 21, 1996 @ 2:25 AM.
  3.  *
  4.  ***/
  5.  
  6.  
  7. #ifndef __DuckGame_H__
  8. #include "DuckGame.h"
  9. #endif
  10. #include "GunSprite.h"
  11. #include "GWorldUtils.h"
  12.  
  13. CSprite*    CDuckGame::MakeExtensionSprite(GWorldPtr image,RgnHandle mask) //Override
  14. {
  15.     return new CDuckSprite(GetWorld(), this, image, mask);
  16. }
  17.  
  18. OSErr        CDuckGame::Initialize()//Override
  19. {
  20.     OSErr        err = noErr;
  21.     
  22.     err = inherited::Initialize();
  23.     if(err == noErr){
  24.         new CGunSprite(GetWorld(), this);
  25.         
  26.         PlaySound(1002,true);
  27.     }
  28.     
  29.     return err;
  30. }
  31.  
  32.  
  33.  
  34. CDuckGame::CDuckGame()
  35.     :    CSpriteGame(128)
  36. {
  37.     
  38. }
  39.  
  40.  
  41. CDuckGame::~CDuckGame()//Override
  42. {
  43.  
  44. }
  45.  
  46. static short    Abs(short v)
  47. {
  48.     if(v < 0){
  49.         return -v;
  50.     }else{
  51.         return v;
  52.     }
  53. }
  54.  
  55. static short    RandomInRange(short lo,short hi)
  56. {
  57.     if(hi == lo){
  58.         return lo;
  59.     }
  60.     
  61.     if(hi < lo){
  62.         short    t = lo;
  63.         lo = hi;
  64.         hi = t;
  65.     }
  66.     
  67.     return (Abs(Random()) % (hi - lo + 1)) + lo;
  68.  
  69. }
  70.  
  71. static short lastDuckOffset;
  72. static short CalcDuckTop()
  73. {
  74.     short        result = CDuckSprite::kDuckStartTop;
  75.     short        curDuckOffset;
  76.  
  77.     for (;;) {
  78.         curDuckOffset = RandomInRange(-100,150);
  79.         if (curDuckOffset < lastDuckOffset - 40) break;
  80.         if (curDuckOffset > lastDuckOffset + 40) break;
  81.     }
  82.     lastDuckOffset = curDuckOffset;
  83.  
  84.     result += curDuckOffset;
  85.     
  86.     return result;
  87. }
  88.  
  89. CDuckSprite::CDuckSprite(CSpriteWorld* world,CSpriteGame* game,GWorldPtr image,
  90.                         RgnHandle mask)
  91.     :    CGameSprite(world, game, 0, NULL, CalcDuckTop(), kDuckStartLeft, NULL),
  92.         fCurDuck(0)
  93. {
  94.     
  95.     if(BuildDuckImage(image,mask) == noErr){
  96.         SetImage(fDucks[0].image, fDucks[0].mask);
  97.     }
  98. }
  99.  
  100.  
  101. CDuckSprite::~CDuckSprite()
  102. {
  103. }
  104.  
  105. void    CDuckSprite::UpdatePosition() //Override
  106. {
  107.     SetNextDuck();
  108.     
  109.     MoveBy(kMoveHInterval,0);
  110.     if(OutOfBoundsQ()){
  111.         MoveToH(0);
  112.     }
  113.     
  114. }
  115.  
  116. Boolean    CDuckSprite::WasHitBy(CSprite*    thisOne)//Override
  117. {
  118. #ifdef OM
  119. #else
  120.     CBulletSprite*        bullet = dynamic_cast<CBulletSprite*>(thisOne);
  121. #endif
  122.     if(bullet != NULL){
  123.         PlaySound(kQuackID);
  124.         delete this;
  125.         delete thisOne;
  126.         return false;
  127.     }else{
  128.         return true;
  129.     }
  130. }
  131.  
  132. OSErr    CDuckSprite::BuildDuckImage(GWorldPtr iconImage,RgnHandle iconMask)
  133. {
  134.     OSErr err = CopyBaseImage(kDuck1,fDucks[0].image,fDucks[0].mask);
  135.     if(err == noErr){
  136.         err = CopyBaseImage(kDuck2,fDucks[1].image,fDucks[1].mask);
  137.         if(err == noErr){
  138.             err = Superimpose(iconImage,iconMask,fDucks[0].image,fDucks[0].mask);
  139.             if(err == noErr){
  140.                 err = Superimpose(iconImage,iconMask,fDucks[1].image,fDucks[1].mask);
  141.             }
  142.         }
  143.     }
  144.     
  145.     return err;
  146. }
  147.  
  148.  
  149. void    CDuckSprite::SetNextDuck()
  150. {
  151.     fCurDuck++;
  152.     if(fCurDuck == 2){
  153.         fCurDuck = 0;
  154.     }
  155.     
  156.     SetImage(fDucks[fCurDuck].image,fDucks[fCurDuck].mask);
  157. }
  158.  
  159. OSErr    CDuckSprite::CopyBaseImage(short id,GWorldPtr& outGWorld,RgnHandle& outMask)
  160. {
  161.     OSErr        err = noErr;
  162.     GWorldPtr    base;
  163.     RgnHandle    mask;
  164.     StSaveGWorld    save;
  165.     
  166.     if(GetGame()->GetImage(id,base,mask)){
  167.         Rect        r = base->portRect;    
  168.         
  169.         err = NewLockedGWorld(&outGWorld, 0, &r, NULL, NULL, 0);
  170.         if(err == noErr){
  171.             SetGWorld(outGWorld,NULL);
  172.             CopyBits((BitMap*)*base->portPixMap,(BitMap*)*outGWorld->portPixMap,&r,&r,srcCopy,NULL);
  173.             outMask = NewRgn();
  174.             CopyRgn(mask,outMask);
  175.             HLock((Handle)outMask);
  176.         }
  177.     }else{
  178.         err = paramErr;
  179.     }
  180.     
  181.     
  182.     
  183.     return err;
  184. }
  185.  
  186.  
  187. OSErr    CDuckSprite::Superimpose(GWorldPtr iconImage,RgnHandle iconMask,GWorldPtr duck,RgnHandle duckMask)
  188. {
  189.     OSErr            err = noErr;
  190.     StSaveGWorld    st;
  191.     Rect            r = iconImage->portRect;
  192.     
  193.     SetGWorld(duck,NULL);
  194.     CopyBits((BitMap*)*iconImage->portPixMap,(BitMap*)*duck->portPixMap,&r,&r,srcCopy,iconMask);
  195.     
  196.     HUnlock((Handle)duckMask);
  197.     UnionRgn(iconMask,duckMask,duckMask);
  198.     HLock((Handle)duckMask);
  199.     
  200.     return err;
  201. }
  202.  
  203. void        CDuckGame::DrawBackground(const Rect& inBounds)
  204. {
  205.     PicHandle        h = GetPicture(1000);
  206.  
  207.     if(h != NULL){
  208.         Rect        r = h[0]->picFrame;
  209.         OffsetRect(&r,-r.left,-r.top);
  210.         DrawPicture(h,&r);
  211.     }
  212.  
  213. }
  214.  
  215.  
  216.  
  217.  
  218.